package com.gsk.europepharma.salesReport.struts.actions;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.json.JSONObject;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hibernate.Query;
import org.hibernate.Session;

import com.gsk.europepharma.salesReport.hibernate.dao.tbSpBoSRCartoContourDAO;
import com.gsk.europepharma.salesReport.utils.Legende;
import com.gsk.europepharma.salesReport.utils.UtilsSalesReport;

public class BornesCarte2 extends Action {
	
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		// Variables de session
		HttpSession sessionObject = request.getSession();
		Integer cs_adm_pdt = (Integer) sessionObject.getAttribute("cs_adm_pdt");
		Integer cs_adm_rgpt = (Integer) sessionObject.getAttribute("cs_adm_rgpt");
		Integer cs_adm_prstn = (Integer) sessionObject.getAttribute("cs_adm_prstn");
		Integer cs_network = (Integer) sessionObject.getAttribute("cs_network");
		Integer cs_month = (Integer) sessionObject.getAttribute("cs_month");
		// Fin de session
		
		// Recuperation des parametres
		
		String calculPalettes = request.getParameter("calculPalettes");
		
		String source = request.getParameter("source");
		Integer CS_SRC = Integer.parseInt(source);
		String unite = request.getParameter("unite");
		String periode = request.getParameter("periode");
		String idGeog = request.getParameter("idGeog");
		Integer idGeogInteger = Integer.parseInt(idGeog);
		String nivGeog = request.getParameter("nivGeog");
		
		// Parametres : Activite et Carto
		String indicateur = request.getParameter("indicateur");
		String indicateur1 = request.getParameter("indicateur1");
		String indicateur2 = request.getParameter("indicateur2");
		
		// Recupération de la legende Secteur
		Legende legendeSecteur = (Legende) sessionObject.getAttribute("legendeSecteur");
		
		if (legendeSecteur.getMin() == null && indicateur.equals("")) { // ISOGEOG  
			
			Double minLegende = 0.0;
			Double maxLegende = 0.0;
			Integer count = 0;
			
			tbSpBoSRCartoContourDAO cartoContourDAO = new tbSpBoSRCartoContourDAO();
			Session session = cartoContourDAO.getSession();
			String strReq = "";
			if (nivGeog.equals("Zone") || nivGeog.equals("Region")) {
				strReq = cartoContourDAO.QUERY_BORNES_CARTE1;
			} else {
				strReq = cartoContourDAO.QUERY_BORNES_CARTE2_SECTEUR;
			}
			Query req = session.createSQLQuery(session.getNamedQuery(strReq).getQueryString());
			req.setString("indicateur", indicateur2);
			req.setString("data", unite + periode);	
			req.setInteger("cs_adm_pdt", cs_adm_pdt);
			req.setInteger("cs_adm_rgpt", cs_adm_rgpt);
			req.setInteger("cs_adm_prstn", cs_adm_prstn);
			req.setInteger("CS_SRC", CS_SRC);
			req.setInteger("cs_month", cs_month);
			req.setInteger("cs_network", cs_network);
			req.setString("nivGeog", nivGeog); 
			req.setInteger("idGeog", idGeogInteger);
			req.setMaxResults(10);
			ArrayList result = new ArrayList(req.list());
			Iterator iter = result.iterator();
			while (iter.hasNext()) {
				Object[] val = (Object[]) iter.next();
				minLegende = Double.parseDouble(val[0].toString());
				maxLegende = Double.parseDouble(val[1].toString());
				count = Integer.parseInt(val[2].toString());
			}
			
			// Mise en session
			legendeSecteur.setMin(minLegende);
			legendeSecteur.setMax(maxLegende);
			legendeSecteur.setCount(count);
			
			if (!legendeSecteur.getTypeClassement().equals("DU")) {
				double pas = (maxLegende - minLegende) / legendeSecteur.getNbTranches();
				double tempPas = minLegende;
				for (int i = 0; i < legendeSecteur.getNbTranches(); i++) {
					legendeSecteur.getPalettes().get(i).setMin(UtilsSalesReport.arrondir(tempPas, 3));
					legendeSecteur.getPalettes().get(i).setMax(UtilsSalesReport.arrondir(tempPas + pas, 3));
					tempPas += pas;
				}
				sessionObject.setAttribute("legendeSecteur", legendeSecteur);
			}
			
		} else if (!indicateur.equals("")) { // HIERARCHIQUE 
			
			Double minLegende = 0.0;
			Double maxLegende = 0.0;
			Integer count = 0;
			
			tbSpBoSRCartoContourDAO cartoContourDAO = new tbSpBoSRCartoContourDAO();
			Session session = cartoContourDAO.getSession();
			String strReq = "";
			if (nivGeog.equals("Zone")) {
				strReq = cartoContourDAO.QUERY_BORNES_CARTE2_REGION;
			} else {
				strReq = cartoContourDAO.QUERY_BORNES_CARTE2_SECTEUR;
			}
			Query req = session.createSQLQuery(session.getNamedQuery(strReq).getQueryString());
			req.setString("indicateur", indicateur);
			req.setString("data", unite + periode);	
			req.setInteger("cs_adm_pdt", cs_adm_pdt);
			req.setInteger("cs_adm_rgpt", cs_adm_rgpt);
			req.setInteger("cs_adm_prstn", cs_adm_prstn);
			req.setInteger("CS_SRC", CS_SRC);
			req.setInteger("cs_month", cs_month);
			req.setInteger("cs_network", cs_network);
			req.setString("nivGeog", nivGeog); 
			req.setInteger("idGeog", idGeogInteger);
			req.setMaxResults(10);
			ArrayList result = new ArrayList(req.list());
			Iterator iter = result.iterator();
			while (iter.hasNext()) {
				Object[] val = (Object[]) iter.next();
				minLegende = Double.parseDouble(val[0].toString());
				maxLegende = Double.parseDouble(val[1].toString());
				count = Integer.parseInt(val[2].toString());
			}
			
			// Mise en session
			legendeSecteur.setMin(minLegende);
			legendeSecteur.setMax(maxLegende);
			legendeSecteur.setCount(count);
			
			if (!legendeSecteur.getTypeClassement().equals("DU")) {
				double pas = (maxLegende - minLegende) / legendeSecteur.getNbTranches();
				double tempPas = minLegende;
				for (int i = 0; i < legendeSecteur.getNbTranches(); i++) {
					legendeSecteur.getPalettes().get(i).setMin(UtilsSalesReport.arrondir(tempPas, 3));
					legendeSecteur.getPalettes().get(i).setMax(UtilsSalesReport.arrondir(tempPas + pas, 3));
					tempPas += pas;
				}
				sessionObject.setAttribute("legendeSecteur", legendeSecteur);
			}
			
		}
		
		// Donnees JSON 
		
		HashMap hm = new HashMap();
		hm.put("minLegende", legendeSecteur.getMin());
		hm.put("maxLegende", legendeSecteur.getMax());
		hm.put("count", legendeSecteur.getCount());
		hm.put("legendeSecteur", legendeSecteur);

		JSONObject json = JSONObject.fromObject(hm);

		response.addHeader("Content-Type", "application/json");
        response.getOutputStream().write(json.toString().getBytes("UTF-8"));
        response.getOutputStream().flush();
		
		return null;
	}

}
